package city.spring.modules.system.service;

import city.spring.modules.system.entity.OrganizationEntity;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Set;

/**
 * Service：组织机构
 *
 * @author 侯坤林
 * @date 2020-05-30 14:06:37
 */
public interface OrganizationService extends IService<OrganizationEntity> {
    String CACHE_NAME = "organization";

    /**
     * 业务处理：保存一个 <strong>组织机构</strong>
     *
     * @param entity 组织机构
     */
    void saveOrganization(OrganizationEntity entity);

    /**
     * 业务处理：修改一个 <strong>组织机构</strong>
     *
     * @param entity 组织机构
     */
    void updateOrganization(OrganizationEntity entity);

    /**
     * 业务处理：删除一个 <strong>组织机构</strong>
     *
     * @param primaryKey 主键ID
     */
    void deleteOrganization(String primaryKey);

    /**
     * 业务处理：删除多个 <strong>组织机构</strong>
     *
     * @param primaryKeys 主键ID列表
     */
    void deleteOrganization(List<String> primaryKeys);

    /**
     * 把原始数据列表转换成树形结构数据
     *
     * @param rawDatasource 原始数据列表
     * @return 从原始数据列表中转换成树形结构数据
     */
    default List<OrganizationEntity> converterToTreeDatasource(List<OrganizationEntity> rawDatasource) {
        return converterToTreeDatasource(rawDatasource, true);
    }

    /**
     * 把原始数据列表转换成树形结构数据
     *
     * @param rawDatasource    原始数据列表
     * @param loadParentEntity 是否加载父级信息：如果处理后的顶级结果中依旧存在父级标识，是否继续加载结果列表中父级信息，建议传入 true ，在搜索的时候有时候只能搜索出子节点，此时可以加载出父节点西悉尼
     * @return 从原始数据列表中转换成树形结构数据
     */
    List<OrganizationEntity> converterToTreeDatasource(List<OrganizationEntity> rawDatasource, boolean loadParentEntity);

    /**
     * 加载权限信息
     *
     * @param entity 组织机构
     */
    void loadPermissions(OrganizationEntity entity);

    /**
     * 加载权限信息
     *
     * @param entities 组织机构列表
     */
    void loadPermissions(List<OrganizationEntity> entities);

    /**
     * 加载角色信息
     *
     * @param entity 用户组
     */
    void loadRoles(OrganizationEntity entity);

    /**
     * 加载角色信息
     *
     * @param entities 用户组列表
     */
    void loadRoles(List<OrganizationEntity> entities);

    /**
     * 通过主键ID获取一个组织机构信息
     *
     * @param primaryKey      组织机构信息主键ID
     * @param loadPermissions 是否加载组织机构信息的特殊权限列表
     * @param loadRoles       是否加载组织机构信息的角色列表
     * @return 用户组信息 group info
     */
    OrganizationEntity getOrganizationInfo(String primaryKey, boolean loadPermissions, boolean loadRoles);

    /**
     * 设置组织机构的角色列表
     *
     * @param entity 组织机构信息
     */
    void setOrganizationRoles(OrganizationEntity entity);

    /**
     * 设置组织机构的附加权限
     *
     * @param entity 组织机构信息
     */
    void setOrganizationPermissions(OrganizationEntity entity);

    /**
     * 获取子级的组织机构ID列表
     *
     * @param parentIds 父级的ID列表
     * @return 子级ID列表
     */
    Set<String> getChildrenIds(Set<String> parentIds);
}